package cn.com.cennavi.dass.uti;

import com.cennavi.mm.thrift.GPS;


public  class GeoTrans {

    
    private double casm_rr ;

    private int casm_t1;
    private int casm_t2;

    private double casm_x1;

    private double casm_y1;

    private double casm_x2;

    private double casm_y2;

    private double casm_f;

    private int wg_flag = 0;
    
    private static double yj_sin2(double x)

    {
            
            double tt ;
            
            double ss;
            
            int ff ;
            
            double s2;
            
            int cc;
            
            ff=0;
            
            if (x<0)
                    
            {
                    
                    x=-x;
                    
                    ff=1;
                    
            }
            
            cc= (int) (x/6.28318530717959);
            
            tt=x-cc*6.28318530717959;
            
            if (tt>3.1415926535897932)
                    
            {
                    
                tt=tt-3.1415926535897932;
                    
                    if (ff==1)
                            
                            ff=0;
                    
                else if (ff==0)
                            
                            ff=1;
                    
            }
            
            x=tt;
            
            ss=x;
            
            s2=x;
            
            tt=tt*tt;
            
            s2=s2*tt;
            
            ss=ss-s2* 0.166666666666667;
            
            s2=s2*tt;
            
            ss=ss+s2* 8.33333333333333E-03;
            
            s2=s2*tt;
            
            ss=ss-s2* 1.98412698412698E-04;
            
            s2=s2*tt;
            
            ss=ss+s2* 2.75573192239859E-06;
            
            s2=s2*tt;
            
            ss=ss-s2* 2.50521083854417E-08;
            
            if (ff==1)
                    
                    ss=-ss;
            
            return ss;
            
    }

    private static double Transform_yj5(double x , double y )

    {
            
            double tt;
            
            tt = 300 + 1 * x + 2 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.sqrt(x*x));
            
            tt = tt + (20 *yj_sin2(18.849555921538764 * x ) + 20 * yj_sin2(6.283185307179588 * x))*0.6667;
            
            tt = tt + (20 * yj_sin2(3.141592653589794 * x ) + 40 * yj_sin2(1.047197551196598 * x))*0.6667;
            
            tt = tt + (150 * yj_sin2(0.2617993877991495 * x) + 300 * yj_sin2(0.1047197551196598 * x))*0.6667;
            
            return tt;
            
    }

    private static double Transform_yjy5(double x , double y )

    {
            
            double tt ;
            
            tt = -100 +  2 * x + 3 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.sqrt(x*x));
            
            tt = tt + (20 * yj_sin2(18.849555921538764 * x) + 20 * yj_sin2(6.283185307179588 * x))*0.6667;
            
            tt = tt + (20 * yj_sin2(3.141592653589794 * y)+ 40 * yj_sin2(1.047197551196598 * y))*0.6667;
            
            tt = tt + (160 * yj_sin2(0.2617993877991495 * y) + 320 * yj_sin2(0.1047197551196598 * y))*0.6667;
            
            return tt;
            
    }

    private static double Transform_jy5(double x , double xx )

    {
            
            double n ;
            
            double a ;
            
            double e ;
            
            a = 6378245;
            
            e = 0.00669342;
            
            n = Math.sqrt (1 - e * yj_sin2(x * 0.0174532925199433) * yj_sin2(x * 0.0174532925199433) );
            
            n = (xx * 180) /(a / n * Math.cos(x * 0.0174532925199433) * 3.1415926) ;
            
            return n;
            
    }

    private static double Transform_jyj5(double x , double yy )

    {
            
            double m ;
            
            double a ;
            
            double e ;
            
            double mm;
            
            a = 6378245;
            
            e = 0.00669342;
            
            mm= 1 - e * yj_sin2(x * 0.0174532925199433) * yj_sin2(x * 0.0174532925199433) ;
            
            m = (a * (1 - e)) / (mm * Math.sqrt(mm));
            
            return (yy * 180) / (m * 3.1415926);
            
    }

    private double r_yj()

    {
            
            int casm_a ;
            
            int casm_c ;
            
            casm_a = 314159269;
            
            casm_c = 453806245;
            
            return 0;
            
    }

    private double random_yj()

    {
            
            int t;
            
            int casm_a ;
            
            int casm_c ;
            
            casm_a = 314159269;
            
            casm_c = 453806245;
            
            casm_rr = casm_a * casm_rr + casm_c ;
            
            t = (int) (casm_rr /2) ;
            
            casm_rr = casm_rr - t * 2;
            
            casm_rr = casm_rr / 2 ;
            
            return (casm_rr);
            
    }





    public static GPS GPointOffset(double lon, double lat)
    {
    		GPS coordBean = new GPS();

            double x_add ;
            double y_add ;
            
            double x_l = lon * 1E6/1E6 ;
            double y_l = lat * 1E6/1E6 ;
            
            x_add = Transform_yj5(x_l - 105, y_l - 35) ;
            
            y_add = Transform_yjy5(x_l - 105, y_l - 35) ;
            
            
            
            
            double china_lng = (x_l + Transform_jy5(y_l, x_add)) ;
            
            double china_lat = (y_l + Transform_jyj5(y_l, y_add)) ;
            
            coordBean.setLatitude(0);
            coordBean.setLongtitude(0);
            
            coordBean.setLatitude(china_lat);
            coordBean.setLongtitude(china_lng);
            
            return coordBean;
            
    }
    
//    public static void main(String[] args) {
//    	String lat = "36.1173660";  //33.19077197342773
//    	String lon = "120.3535000"; //115.81258376686078
//    	
//    	OffSetCoordBean coordBean = GeoTrans.GPointOffset(Double.valueOf(lat), Double.valueOf(lon));
//    	System.out.println(coordBean.getLat());
//    	System.out.println(coordBean.getLon());
//    	//36.11761640263172
//    	//120.35861110772397
//    }
    
}
